#include <cstddef>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <pthread.h>
#include <sched.h>
#include <unistd.h>
#include <vector>
#include <sys/wait.h>
#include <signal.h>
using namespace std;
//******************************************
// int *p = nullptr;
// void* threadrun(void* args) {
//     // int a = 123;
//     // p = &a;
//     p = new int(123);
//     while (true) {
//         sleep(1);
//     }
// }
// int main() {
//     pthread_t tid;
//     pthread_create(&tid, nullptr, threadrun, nullptr);
//     sleep(1);
//     while(true) {
//         if(p == nullptr) {
//             cout << "NULL" << endl;
//             return 1;
//         }
//         cout << "*p : " << *p << endl;
//         sleep(1);
//     }
//     pthread_join(tid, nullptr);
//     return 0;
// }
//******************************************
// #define STACK_SIZE (1024 * 1024)
// static int child_func(void* args) {
//     int cnt = 4;
//     while (cnt--) {
//         printf("child process pid : %d\n", getpid());
//         sleep(1);
//     }
//     return 0;
// }
// int main() {
//     char* stack = (char*)malloc(STACK_SIZE);
//     if(stack == NULL) {
//         perror("malloc");
//         exit(EXIT_FAILURE);
//     }
//     // 使用clone函数来创建我的子进程
//     pid_t pid = clone(child_func, stack + STACK_SIZE, CLONE_VM | SIGCHLD, NULL);
//     if(pid == -1) {
//         perror("clone");
//         free(stack);
//         exit(EXIT_FAILURE);
//     }
//     printf("Parent process: pid = %d, Child pid = %d\n", getpid(), pid);
//     // fflush(stdout);
//     // 等待子进程退出
//     if(waitpid(pid, NULL, 0) == -1) {
//         perror("waitpid");
//         free(stack);
//         exit(EXIT_FAILURE);
//     }
//     free(stack);
//     return 0;
// }
//******************************************
// const int num = 10;
//******************************************
// 这里实现的是创建多个线程
// void* routine(void* args) {
//     // sleep(1);
//     string name = static_cast<const char*>(args);
//     delete (char*)args;
//     int cnt = 5;
//     while(cnt--) {
//         cout << "我是新线程，我的名字是：" << name << endl;
//         sleep(1);
//     }
//     return nullptr;
// }
// int main() {
//     vector<pthread_t> tids;
//     for(int i = 0; i < num; i++) {
//         pthread_t tid;
//         char* name = new char[64];
//         snprintf(name, 64, "thread_%d", i);
//         int n = pthread_create(&tid, nullptr, routine, (void*)name);
//         if(n == 0) {
//             tids.push_back(tid);
//         }else {
//             continue;
//         }
//     }
//     for (int i = 0; i < num; i++)
//     {
//         // 一个一个的等待
//         int n = pthread_join(tids[i], nullptr);
//         if (n == 0)
//         {
//             std::cout << "等待新线程成功" << std::endl;
//         }
//     }
//     return 0;
// }

//******************************************
// // 工作类
// class Task {
// public:
//     Task(int x, int y) : _a(x), _b(y) {}
//     int func() {
//         return _a + _b;
//     }
//     ~Task() {}
// private:
//     int _a, _b;
// };
// // 结果类
// class Result {
// public:
//     Result(int ret) : _ret(ret) {}
//     int get() {
//         return _ret;
//     }
//     ~Result() {}
// private:
//     int _ret;
// };
// void* routine(void* args) {
//     Task* t = static_cast<Task*>(args);
//     // sleep(7);
//     // Result* res = new Result(t->func());
//     // sleep(1);
//     // return res;
//     // pthread_exit(res);
//     // // pthread_detach(pthread_self());
//     string name = (const char*)(args);
//     // // cout << "我是新线程，我分离了!" << endl;
//     // int cnt = 5;
//     int cnt = 10;
//     while(cnt--) {
//         cout << "new线程的名字：" << name << endl;
//         sleep(1); 
//     }
//     return nullptr;
// }
// int main() {
//     pthread_t tid;
//     // Task* t = new Task(10, 20);
//     pthread_create(&tid, nullptr, routine, (void*)"thread_1");
//     // pthread_create(&tid, nullptr, routine, (void*)t);
//     // int cnt = 5; 
//     // while(cnt--) {
//     //     cout << "我是主线程。" << endl;
//     //     sleep(1);
//     // }
//     // int n = pthread_join(tid, nullptr);
//     // if(n != 0) {
//     //     cout << "pthread join error: " << strerror(n) << endl;
//     // }else {
//     //     cout << "pthread join success: " << strerror(n) << endl;
//     // }
//     sleep(3);
//     pthread_cancel(tid);
//     cout << "我们创建的那个新线程已经被取消了" << endl;
//     // void *ret = nullptr;
//     // pthread_join(tid, &ret);
//     // cout << "新线程结束了，结果是：" << (long long)ret << endl; // 拿到了地址
//     // Result* r = nullptr;
//     // pthread_join(tid, (void**)&r);
//     // int temp = r->get();
//     // cout << "新线程结束了，计算结果是：" << temp << endl;
//     // delete r;
//     return 0;
// }